/*
 * G2OParse.h
 *
 *  Created on: Sep 8, 2016
 *      Author: ubuntu
 */

#ifndef SRC_G2O_G2OPARSE_H_
#define SRC_G2O_G2OPARSE_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <time.h>

struct g2o_login {
	char dp_code[3]; 			// 开发者代码
	char obdid[13]; 			// 设备序列号
	char dev_key[33]; 			// 设备密钥
	char dev_imei[16]; 			// 设备IMEI码
	char dev_sim[21]; 			// SIM卡号
	unsigned char dpu_len; 		// DPU字符串长度
	char *dev_version; 			// 设备软件版本号
};

struct g2o_gps {
	unsigned char position_mode; 		// 定位模式
	unsigned short direction; 			// 方向
	unsigned short speed; 				// 速度
	unsigned short height; 				// 高度
	double longitude; 					// 经度
	double latitude; 					// 纬度
	time_t ts;
	int is_valid;
	struct g2o_gps *next;
};

#define GOLO_BIT1	0x01
#define GOLO_BIT2	0x02
#define GOLO_BIT3	0x04
#define GOLO_BIT4	0x08
#define GOLO_BIT5	0x10
#define GOLO_BIT6	0x20
#define GOLO_BIT7	0x40
#define GOLO_BIT8	0x80

struct g2o_data_stream {
	unsigned char table_len; 			// 码表长度
	int mark[32];						// 码表对应位码值
	int oil; 							// 用油量
	unsigned char air_temp;					// 发动机进气温度
	unsigned short water_temp; 			// 水温
	unsigned short voltage; 			// 电池电压
	unsigned short car_speed; 			// 车速
	unsigned short engine_speed; 		// 转速 
	unsigned short instant_fuel_km; 	// 瞬时油耗
	unsigned short instant_fuel_h; 		// 瞬时油耗
	unsigned short air_flow; 			// 空气流量
	unsigned char press;					// 
	unsigned short remain_fuel; 		// 滤波后剩余油量
	unsigned int mileage; 				// 累计里程
	unsigned int mileage_id; 			// 里程ID
	int is_valid;
	time_t ts;
	struct g2o_data_stream *next;
};

typedef enum _warn_type_t {
	G2O_WARN_TYPE_TIRED = 0xEFF7,			/* 疲劳驾驶报警 */
	G2O_WARN_TYPE_IDLE = 0xEFFE,			/* 怠速报警 */
	G2O_WARN_TYPE_FAST = 0x0517, 			/* 急加速报警 */
	G2O_WARN_TYPE_DESC = 0x0518,			/* 急减速报警 */
	G2O_WARN_TYPE_VIBRATION = 0xEFF9, 		/* 驻车震动报警 */
	G2O_WARN_TYPE_STARTUP = 0xF015, 		/* 车辆启动报警*/
	G2O_WARN_TYPE_SHARP_TURN = 0xF020, 		/* 急转弯报警 */
	G2O_WARN_TYPE_INSERT_PULLED = 0x0520	/* 插入 拔出 报警 */
} warn_type_t;


struct g2o_warn {
	unsigned short id;				// 报警ID
	unsigned char warn_len; 		// 消息长度
	char *warn_msg; 				// 报警消息
};

typedef enum _travel_type_t {
	G2O_TRAVEL_TYPE_START = 0x01,			/* 正常行程开始 */
	G2O_TRAVEL_TYPE_FINISH = 0x02, 			/* 正常行程结束 */
	G2O_TRAVEL_TYPE_GPS_START = 0x06,		/* GPS行程开始 */
	G2O_TRAVEL_TYPE_GPS_FINISH = 0x05,		/* GPS行程结束 */
} travel_type_t;

struct g2o_travel {
	unsigned char type;				/* 0: 行程开始 1: 正常行程结束 */
	unsigned int number; 			/* 行程序号 */
	time_t ts;						/* 开始时间, 结束时间 */
	double lng_start;
	double lng_end;
	double lat_start;
	double lat_end;
	unsigned short idling_cnt; 		/* 怠速次数 */
	unsigned short idling_tm; 		/* 怠速时间单位: 分钟*/
	unsigned int mileage; 			/* 本次行驶里程 */
	unsigned short oil;				/* 本次行驶油耗 */
	time_t ts_gps;					/* GPS 行程结束中的开始时间 */
};

struct g2o_upgrade {
	unsigned char type;
	unsigned char vsn_len;
	char version[12];
};

struct g2o_msg{
	time_t curtime;						// 接收消息当前时间
	unsigned short id; 					// 业务ID
	unsigned char pro; 					// 协议号
	struct g2o_login *login; 			// 登录请求
	int gps_cnt; 						// GPS数据个数
	struct g2o_gps *gps; 				// GPS数据
	struct g2o_gps *gps_tail;
	int stm_cnt; 						// 数据流数据个数 
	struct g2o_data_stream *stream;  	// 数据流
	struct g2o_data_stream *stream_tail;
	struct g2o_warn *warn; 				// 报警消息
	struct g2o_travel *travel; 			// 行程消息
	struct g2o_upgrade *upgrade; 		// 升级数据 

	unsigned char gsm_sig_inensity; 	// GSM 信息强度
	unsigned char cfg_type;
	unsigned int car_typeid; 			// 车型ID 4字节

	time_t ts; 							// 时间戳
	int is_valid;
};

typedef enum g2o_type {
	G2O_LOGIN = 0x0002,	 			/* 用于与服务器建立连接 */
	G2O_GPSDATA = 0x0003, 			/* 传输GPS数据 */
	G2O_DATA_STREAM = 0x0004, 		/* 传输数据流*/
	G2O_CONFIG_INFO = 0x0006,		/* 配置信息 数据传输（服务器直接转发) */
	G2O_WARN_MSG = 0x0007,			/* 报警消息 数据传输 */
	G2O_TRAVEL_STCS = 0x008,		/* 行程统计信息数据传输 */
	G2O_PACKED_DATA = 0x0009,		/* 打包数据 数据传输 */
	G2O_UNKNOWN_000A = 0x000A,
	G2O_UNKNOWN_000F = 0x000F,
	G2O_BEAT_DATA = 0x000C, 		/* 心跳业务 数据传输 */
	G2O_UPGRADE	= 0x000D, 			/* 下位机版本升级 数据传输 */
	G2O_LOGIN_RSP = 0x1002, 		/* 登录响应 服务器地终端登录请求的响应 */
	G2O_CONFIG_RSP = 0x1006, 		/* 配置信息 数据传输响应（服务器直接转发) */
	G2O_WARN_MSG_RSP = 0x1007,  	/* 报警消息 响应*/
	G2O_TRAVEL_RSP = 0x1008, 		/* 行程统计信息 数据传输回复 */
	G2O_PACKED_DATA_RSP = 0x1009, 	/* 打包数据 响应 */
	G2O_UNKNOWN_000A_RSP = 0x100A,
	G2O_UNKNOWN_000F_RSP = 0x100F,
	G2O_BEAT_RSP = 0x100C,			/* 心跳业务 数据传输 */
	G2O_UPGRADE_RSP = 0x100D		/* 下位机版本升级 数据传输响应 */
} g2o_type;

void G2OParsePackage(unsigned char *buf, size_t len, struct g2o_msg *msg);

void G2O_free_msg(struct g2o_msg *msg);

#ifdef __cplusplus
}
#endif

#endif /* SRC_G2O_G2OPARSE_H_ */
